package br.ufrj.dcc;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.HashMap;

class Cliente
{
	HashMap<String,String> localizacao;

	public int go(String ip){
		try{
			String requisicao;
			String resposta;
			Socket clientSocket = null;

			BufferedReader doTerminal = new BufferedReader( new InputStreamReader(System.in));
			clientSocket =null;
			while(true){
			try{
				clientSocket = new Socket(ip, 4444);
				break;
			}
			catch (Exception e) {
				this.wait(1);
				System.out.println("Não conseguiu abrir o socket");
				}
			
			}
			DataOutputStream enviando = new DataOutputStream(clientSocket.getOutputStream());
			BufferedReader recebendo = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
			while(true){
				requisicao = doTerminal.readLine();
				if (requisicao.startsWith(";;")){
					System.out.println(requisicao.split(";;")[0]);
					System.out.println(requisicao.split(";;")[1]);
					System.out.println(requisicao.split(";;")[2]);



					if(tratarRequisicao(requisicao)==0);
					return 0;
				}
				else{
					enviando.writeBytes(requisicao + '\n');
					resposta = recebendo.readLine();
					if(resposta.startsWith("**")){
						tratarResposta(resposta);
					}
					System.out.println("-" + resposta);
				}
			}
		}
		catch (Exception e) {
			System.out.println("exception");
		}
		return 0;
	}

	private void tratarResposta(String resposta) {

		String user=resposta.split("/")[0].substring(2,resposta.split("/")[0].length()-2);
		String endereco=resposta.split("/")[1].split(":")[0];
		System.out.println(user);
		System.out.println(endereco);
		//		String usuario =resposta.split("**")[0];
		//		System.out.println("usuario" + usuario);
		//		String ip = resposta.split("**")[1];
		//		System.out.println("ip " + ip);
		//		
		localizacao.put(user, endereco);

	}

	private int tratarRequisicao(String requisicao) {
		if ((requisicao.split(";;")[2])!=null){
			String enderecoAlvo=localizacao.get(requisicao.split(";;")[2]);
			if (enderecoAlvo!=null){
				System.out.println(enderecoAlvo);
				new Cliente().go(enderecoAlvo);
				return 0;
			}
		}
		//se não esta bem formado
		return 1;


	}
	public Cliente(){
		localizacao = new HashMap<String, String>();
	}
}
